本篇擷取重點:
一、網頁資料儲存方式的基本比較總覽
項目 | 變數 | 變數儲存位置 | 生命週期 |
---|---|---|---|
Application | 所有瀏覽器共用一個 | 伺服器 | 不關伺服器就一直存在 |
Cookies | 一個瀏覽器一個 | 客戶端 | 通常存在1000分鐘,也可以自己設時間 |
Session | 一個瀏覽器一個 | 伺服器 | 關掉網頁就消失。也可設定存活時間(預設為20分鐘) |
Page.Cache | 所有瀏覽器在同時間共用一個 | 伺服器 | 自己設定時間,時間到消失,不受網頁關閉或關機影響 |
==================================================================
貼心小補充:
ViewState:
ViewState是儲存於用戶端(Client-Base)的狀態管理機制,只存在於使用者正在執行那一頁,用來保存來回存取(Postback)之間的網頁和控制項的值,根據預設(EnableViewState=true),當ASP.NET執行網頁時,會收集網頁和所有控制項中的值並透過單一編碼(Base64)的字串,存放於隱藏表單欄位(hidden field)的值(Value)屬性中( _ VIEWSTATE),由於隱藏表單欄位是傳送至使用者端網頁的一部分,所有ViewState值會暫時存放在用戶端的瀏覽器中。
使用方式:
application("變數名稱")=變數值
特點:
使用ViewState前需先注意,ASP.NET 網頁中必須要有伺服器表單< form runat=”server”>,伺服器執行網頁值,ASP.NET網頁架構才能讀取/儲存隱藏欄位ViewState資訊,否則ViewState將無法正常運作。
我們可從下列範例中了解ViewState怎麼儲存:
按滑鼠右鍵-檢視網頁原始碼,可以發現我們剛才在帳號欄輸入的test444,已被儲存在隱藏欄位中,如下:
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="gQeviSKZZJ/Com9YcDDcklBCRk/P8lqLEXLLqKCSn1A08iBzsZuSrHH7usnXov5lHczadZryok5RD7+BGrggnlXS6DbFDxmoZUcEszKQ3tY=" />
按滑鼠右鍵-檢視網頁原始碼,可以發現我們剛才在帳號欄輸入的helloworld,也已被儲存在隱藏欄位中如下:
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="r1lxS0TDNzZO1jYpf8uBZfDhoKJc6gQCzIJrRXq24/MsXwSAb8fqh+NuDNu9GoyHgBR18S0oZPtdmi+wWHsxvqQFF/8naNHl4sk3u5MzWzM3zKF/7gDILCxqyYmDqnbbbJPoGRhoBmdXSFoDaxx3ssOi/Pj8uHfKJFOaPqIQgow=" />
兩邊看似亂碼的部分,就是帳號欄輸入的內容(test444/helloworld)經過Base64編碼後產生的字串,而它儲存的位置就是隱藏表單欄位。
參考資料:
https://dotblogs.com.tw/marcus116/2011/05/24/25923
https://www.itread01.com/content/1547610687.html (使用步驟)
https://dotblogs.com.tw/hatelove/archive/2009/06/28/viewstate-session-cache-cookies-application-of-user-state.aspx
==================================================================
二、網頁資料儲存方式的個別範例實做
資料存放在伺服器端,會佔用伺服器系統資源。當IIS或網頁伺服器重新啟動、修改Global.asax、修改 web.config時, Application的值便會遺失。
使用方式:application("變數名稱")=變數值
==================================================================
貼心小補充,
用途:不同使用者之間(不同連線)共用某些系統變數,例如:網頁瀏覽次數。
Q:因為網頁瀏覽次數變數是共用,所以會有互相搶用的問題,所以在修改該值時都應該先 Lock。
Application.Lock() → Application("count")+=1 → Application.UnLock()
==================================================================
將資料存在使用者的電腦中,大多瀏覽器限制檔案大小不得超過 4096 Bytes,每個網站最多存放20個 Cookie。通常用來記錄使用者名稱、帳號、上次到訪時間......等等。
使用方式:Response.Cookies("變數名稱").Value=變數值
==================================================================
貼心小補充,
設定 Cookie 有效期限 Response.Cookies("變數名稱").Expires=Now.AddDays(180) '180天後到期
限制:同一網域名稱的網頁才能存取該網站所儲存的 cookies,因為資料是存在使用者的電腦中,傳送時是以明碼方式傳送,機密資料不建議以此方式儲存。
==================================================================
資料存放在伺服器端,安全性高,缺點為佔用伺服器的記憶體資源(每一連線便佔用一份記憶體空間),連線結束時會自動刪除。建議程式中隨時將不用的 Session 釋放掉,以免造成伺服器記憶體的負擔。
使用方式:session("變數名稱")=變數值
==================================================================
貼心小補充,其他常見的session使用方法:
參考資料:
https://dotblogs.com.tw/mis0800/2014/02/07/142823
==================================================================
資料存放在伺服器端,主要是以降低資料庫使用率為出發,舉例來說,今天電商網站的首頁可能會有很多商品,如果你今天每一個訪客到首頁你都去資料庫重新抓一次所有的資料,那對資料庫的負擔會非常非常大。可是呢,其實首頁的這些資訊基本上短期之內是不會變的,一個商品的價格不可能上一秒是一千元,下一秒就變成兩千元。所以這些不常變動的資料就很適合儲存起來,等到伺服器再次接到請求時若是發現已經看過且預存在Cache後,就可以用極快的速度撈出來,而不是再到資料庫裡面重新算一次,這樣的方式就是我們說的Cache(快取,或緩存)。
參考資料:
https://progressbar.tw/posts/93
https://blog.techbridge.cc/2017/06/17/cache-introduction/
此篇內容整理自多篇網路文章、PPT及自己的理解,但筆者也仍處在初階的學習過程,對程式概念的理解及判斷都尚不足,若有錯誤的地方,也煩請各位大大提點,先謝謝大家惹!!
明日(9/24)預定探討課題: